#pragma once

#include<cstdlib>
#include<cstring>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "lockGuard.hpp"
#include "error.hpp"


// 守护进程，本质就是孤儿进程
void daemonRun()
{
    // 1. 创建子进程，父进程退出
    pid_t pid = fork();
    if(pid < 0)
    {
        logMessage(Fatal, "fork error");
        exit(FORK_ERROR);
    }
    else if(pid > 0)
    {
        // 父进程退出
        exit(0);
    }

    // 2. 子进程创建新会话
    pid_t ret = setsid();
    if(ret < 0)
    {
        logMessage(Fatal, "setsid error");
        exit(SETSID_ERROR);
    }

    // // 3. 改变当前工作目录
    // chdir("/");

    // 4. 重设文件掩码
    umask(0);

    // 5. 关闭文件描述符
    int fd = open("/dev/null", O_RDWR);
    if(fd < 0)
    {
        logMessage(Error, "open error");
        exit(OPEN_ERROR);
    }
    for(int i = 0; i < 3; ++i)
    {
        dup2(fd, i);
    }
    close(fd);

    // 6. 忽略SIGCHLD信号
    signal(SIGCHLD, SIG_IGN);
    signal(SIGPIPE, SIG_IGN);
}